#include<iostream>//ZOJ - 2697
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define pb push_back
#define sz(x) (int)x.size()
const int maxn = 1100;
int rd(){int x;scanf("%d",&x);return x;}

int n,m;
int g[maxn][maxn],re[maxn][maxn];
bool f[maxn][maxn];
int id[maxn],to[maxn];
/*******拓扑排序*****************/
int dfn[maxn],low[maxn],cnt,scnt,get[maxn];
//拓扑排序的结果存在low里面，get表示原来每个点在拓扑图里面的序 
void dfs(int g[][maxn],int k)
{
	dfn[k]=cnt++;
	for(int i=1; i<=n; i++)
	if(g[i][k])//注意这个地方传的是反图才行
	{
		if(dfn[i]==-1)
			dfs(g,i);
	}
	++scnt;
	low[scnt]=k;
	get[k]=scnt;
}
void topo(int g[][maxn])
{
	int i,j;
	memset(dfn,-1,sizeof(dfn));
	memset(low,-1,sizeof(low));
	cnt=scnt=0;
	for(i=1; i<=n; i++)
	if(dfn[i]==-1)
	{
		dfs(g,i);
	}
}
/*******拓扑排序*****************/
vector<int>vc;
int main()
{
	//freopen("in","r",stdin);
	int i,j;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int x,y,z;
		memset(g,0,sizeof(g));
		memset(re,0,sizeof(re));
		memset(f,0,sizeof(f));
		memset(id,0,sizeof(id));
		memset(to,0,sizeof(to));
		int flag=0;
		vc.clear();
		for(i=1; i<=m; i++)
		{
			x=rd(); y=rd(); z=rd();
			if(g[x][y]!=0 && z==1)
			{
				flag=1;
			}
			g[x][y]=i;
			if(z)
			{
				re[y][x]=i;
			}
			else
				re[x][y]=i;
		}
		if(!flag)
		{
			topo(g);
			for(i=1; i<=n; i++)
				id[i]=low[i];
			topo(re);
			for(i=1; i<=n; i++)
				to[i]=get[i];
			id[0]=to[0]=0;
			for(i=1; i<=n; i++)
			{
				j=i;
				while(1)
				{
					if(to[id[j]]<to[id[j-1]])
					{
						if(g[id[j-1]][id[j]])
						{
							vc.pb(g[id[j-1]][id[j]]);
						}
						swap(id[j],id[j-1]);
					}
					else	break;
					j--;
				}
			}
		}
		if(flag)
		{
			printf("-1\n");
		}
		else
		{
			i=0;
			printf("%d\n",sz(vc));
			for(i=0; i<sz(vc)-1; i++)
			{
				printf("%d ",vc[i]);
			}
			if(i<sz(vc))
			{
				printf("%d\n",vc[i]);
			}
		}
		puts("");
	}	
}
